(function () {
var app = window.app = {};
app.esced = new Date();
app.pages = [];

app.host = {
	'dev'    : 'http://tongxing.cdlinglu.cn/',
	'pro'    : 'http://app.kanahu.com/',
	'domain' : function () {
		var dev = ('true' == localStorage.getItem('dev'));
		return dev ? this.dev : this.pro;
	}
};
app.link = {
	'reset'  : function () {
		this.server = app.host.domain();
		this.image  = app.host.domain();
		this.share  = app.host.domain()+'?';// 分享
		this.ally   = app.host.domain()+'?';// 分销
	}
};
app.link.reset();

// 检测网络连接是否正常
app.isNetwordReady = function () {
	return plus.networkinfo.getCurrentType() == 1;
};
/**
 * 添加缓存数据  
 * @param {Object} key
 * @param {Object} value
 */
app.store = function (key, value) {
	if (0 == arguments.length) { return undefined; }
	// get
	if (1 == arguments.length) {
		var v = localStorage.getItem(key);
		if (v && '{' == v.charAt(0)) {
			try { v = JSON.parse(v) } catch (e) {}	
		}
		return v;
	}
	// set
	if (2 == arguments.length) {
		var v = 'string' == typeof(value) ? value : JSON.stringify(value);
		localStorage.setItem(key, v);
	}
}
/**
 * 显示3.5秒的toast错误提示信息
 * @param {String} 提示字符串
 */
app.error = function (text) {
	plus.nativeUI.toast(text, {'duration':'long'});
};
/**
 * 显示toast提示信息，如果需要微信APP直接改此
 * @param {Object} text
 */
app.toast = function (text) {
	plus.nativeUI.toast(text);
}
/**
 * 取得ArtTemplate并填充数据再把数据放于直接dom下。已做try catch处理
 * @param {Object} 用于放置构造出来的tpl代码的容器，可是jquery对象也可以是jquery的选择表达式
 * @return {String} 模板ID
 * @return {Object} 数据
 */
app.tpl = function (dom, tpl, data) {
	if (undefined !== data) {
		try { $(dom).html(template(tpl, data)); } catch (e) { app.log(e); };	
	} else if (undefined !== tpl) {
		return template(dom, tpl);
	}
};
/**
 * 补全URL地址
 * @param {String} API的URL后半段
 */
app.url = function (link) {
	console.log('请求链接：' + app.link.server + link);
	return app.link.server + link;
}
/**
 * 快速关闭新打开的页面回到首页
 */
app.home = function () {
	var preload = ['HBuilder', 'home.html', 'category.html', 'discover.html', 'cart.html', 'member.html'];
	var pages = plus.webview.all();
	var views = [], uid = -1;
	function close_later () {
		setTimeout(function () {
			if (views.length > 0) {
				var v = views.pop();
				app.log('关闭页面：'+v.id);
				try {v.close();} catch (e) {}
				close_later();
			} else {
				app.log('关闭结束');
			}
		}, 200);
	}
	for (var i in pages) {
		try {
			var view = pages[i];
			if (-1 == preload.indexOf(view.id) && -1 < view.id.indexOf('.html')) {
				view.hide(); views.push(view);
			}
		} catch (e) {}
	}
	close_later();
}
/**
 * 开发时用于打印日志，上线后此方法内不做任何事
 * @param {Object} data
 */
app.log = function (key, value) {
	
	if (mui.os.ios) { return; }
	if (undefined == value) {value = key, key = ''}
	
	if ('string' == typeof(value)) {
		console.log(key + value);
	} else {
		console.log(key + JSON.stringify(value));
	}
}
/**
 * 预加载页面
 * @param {Object} link
 * @param {Object} data
 * @param {Object} style
 */
app.preload = function (link, data, style) {
	// 作用域是公用的
	return mui.preload({
		'url'    : link,
		'id'     : link,
		'styles' : style || {top:'0px', bottom:'45px'},
		'extras' : {extras:mui.extend({_FROM_:plus.webview.currentWebview().id}, data || {})},
	});
};
/**
 * 打开一个部分自定义的页面（头部，内容 均自己定义。底部使用通用）
 * @param {Object} link
 * @param {Object} data
 */
app.load = function (link, data) {
	return app.open(link, data, {top:'0px', bottom:'45px'});
};
/**
 * 打开一个完全自己定义的新页面（头部，内容，底部 均自己定义）
 * @param {Object} link
 * @param {Object} data
 */
app.open = function (link, data, style) {
	app.pages.push(link);
	
	return mui.openWindow({
	    'url'       : link,
	    'id'        : link,
	    'styles'    : style || {},
	    'extras'    : {extras:mui.extend({_FROM_:plus.webview.currentWebview().id}, data || {})},
	    'createNew' : false,//是否重复创建同样id的webview，默认为false:不重复创建，直接显示
	    'waiting'   : {
	    	autoShow : true,//自动显示等待框，默认为true
	    	title    : '正在加载...',//等待对话框上显示的提示内容
	    }
	});
};

// 为普通WEB作hack让plus部分代码不报错
setTimeout(function () {
if (!mui.os.wechat) { return; }

if (!window.plus) {
	var view = {
		'id'        : '',
		'isVisible' : function () { return true; },
	};
	window.plus = {
		'nativeUI' : {
			'toast'        : function () {},
			'showWaiting'  : function () {},
			'closeWaiting' : function () {},
		},
		'webview' : {
			'currentWebview' : function () {
				return view;
			},
		},
	};
}

if (mui.os.wechat) {
	var cart = window.cart = {};
	cart.add = function (data, cb) {
		data = data || {};
		
		data.token              = app.store('token');
		data.goods_id           = data.id;
		data.goods_num          = data.quantity;
		data.goods_attr_val_ids = (data.sku || []).join(',');
		
		plus.nativeUI.showWaiting('加入购物车...');
		app.log('请求参数：', data);
		$.ajax({
			'dataType' : 'json',
			'type'     : 'post',
			'url'      : app.url('App/Cart/Index/create'),
			'data'     : data,
		})
		.fail(function (res) {
			// 失败回调
			plus.nativeUI.closeWaiting();
			app.toast('加入购物车失败');
			app.log('加入购物车失败：', res);
		})
		.done(function (res) {
			// 成功回调
			plus.nativeUI.closeWaiting();
			app.log('加入购物车：', res);
			
			if (500 == res.code) { app.toast('你还未登录'); app.tryResetPullLoading(); return; }
			if (300 == res.code) { app.toast(res.msg); return; }
			if (200 != res.code) { app.toast('请求失败'); return; }
			if (res.msg) { app.toast(res.msg); } else { app.toast('加入购物车成功'); }
			
			cb && cb(res);
		})
		;
	}
}
}, 1000);

if (!Array.prototype.find) {
  Object.defineProperty(Array.prototype, 'find', {
    enumerable: false,
    configurable: true,
    writable: true,
    value: function(predicate) {
      if (this == null) {
        throw new TypeError('Array.prototype.find called on null or undefined');
      }
      if (typeof predicate !== 'function') {
        throw new TypeError('predicate must be a function');
      }
      var list = Object(this);
      var length = list.length >>> 0;
      var thisArg = arguments[1];
      var value;

      for (var i = 0; i < length; i++) {
        if (i in list) {
          value = list[i];
          if (predicate.call(thisArg, value, i, list)) {
            return value;
          }
        }
      }
      return undefined;
    }
  });
}
app.tryResetPullLoading = function () {
	try {
	if ($('.container-pull-refresh').length == 0) { return; }
	
	var pullrefresh = mui('.container-pull-refresh').pullRefresh();
	pullrefresh.endPullupToRefresh();
	pullrefresh.endPulldownToRefresh();
	} catch (e) {}
}
app.avatar = function (v) {
	return v ? app.image(v, '_0_100') : '../image/icon-no-image.png';
};
app.image = function (v, pattern) {
	if (!v) { return '../image/icon-no-image.png'; }
	if (pattern && /^_\d+_\d+$/ig.test(pattern)) {
		var idx = v.lastIndexOf('.');
		var zip = v.substr(0, idx) + pattern + v.substr(idx);
		
		return app.link.image + zip;
	}
	return v ? (app.link.image + v) : '../image/icon-no-image.png';
};
template.helper('avatar', function (v) {
	return app.avatar(v);
});
template.helper('image', function (v, pattern) {
	return app.image(v, pattern);
});
template.helper('thumb', function (v) {
	return app.image(v, '_100_100');
});
template.helper('price', function (v) {
	return v ? (v/100) : '0.00';
});

// AJAX请求时统一操作
$.ajaxSetup({
	dataType : 'json',
	success  : function (res) {
		// 提示登录失败或失效时清空本地的session_key
		if (res && 500 == res.code) {
			localStorage.removeItem('token');
			localStorage.removeItem('member');
		}
	}
});

})();
